In [1]:
from IPython.display import Image
In [2]:
def imprimir_fichas_domino():
''' Imprime las fichas del dominó. '''
for i in range(7):
for j in range(i,7):
print(i,"/",j,end=" | ")
print()
def main():
imprimir_fichas_domino()
main()
In [3]:
def imprimir_fichas_domino(n=6):
''' Imprime las fichas de un juego de dominó con números entre el 0 y n. '''
for i in range(n+1):
for j in range(i,n+1):
print(i,"/",j,end=" | ")
print()
def main():
imprimir_fichas_domino(8)
main()
Notas de la clase:
n = 6
es un parámetro "por defecto" y nos da la libertad de pasarle o no el parámetro a la función. Si el parámetro no se indica, entonces la función hace de cuenta que se le pasó el valor por defecto.
In [4]:
def obtener_producto_maximo(a, b, c, d):
'''
Dados cuatro números enteros a, b, c y d, devuelve el producto
máximo entre dos de ellos.
'''
# Versión con acumulador
maximo=max(a*b,a*c)
maximo=max(maximo,a*d)
maximo=max(maximo,b*c)
maximo=max(maximo,b*d)
maximo=max(maximo,c*d)
return maximo
def obtener_producto_maximo_pythonic(a, b, c, d):
# Versión python
return max(a*b, a*c, a*d, b*c, b*d, c*d)
print( "Obtener producto maximo version multilang:", obtener_producto_maximo(2, 3, 4, -1) )
print( "Obtener producto maximo version Python:", obtener_producto_maximo_pythonic(2, 3, 4, -1) )
Notas de la clase:
In [5]:
Image(filename='./clase-23-03-2018_image/max_pairs.jpg')
Out[5]:
Aunque la forma mas razonable, es no estar guardando muchos resultados intermedios cuando los podemos descartar porque ya sabemos que no sirven:
In [6]:
Image(filename='./clase-23-03-2018_image/max_univalue.jpg')
Out[6]:
Notar que en ambos casos se hace el mismo numero de comparaciones, pero para codificar uno u otro se requieren distinto numero de variables. Mas aun, el segundo modo, permite generalizarlo facilmente para poder utilizarlo dentro de un ciclo, como se hace en un ejercicio mas adelante.
In [7]:
def imprimir_matriz_identidad(n):
'''
Imprime por pantalla una matriz identidad de NxN.
'''
for i in range(n):
for j in range(n):
if i == j:
print('1', end=' ')
else:
print('0', end=' ')
print()
imprimir_matriz_identidad(3)
In [8]:
def es_par(n):
'''
Devuelve True si el número n es par.
'''
return (n % 2 == 0)
print('¿Es par 19?', es_par(19))
print('¿Es par 12?', es_par(12))
Notas de la clase:
if
cuando se va a devolver el valor booleano resultante. La expresión (n % 2 == 0)
ya da como resultado un valor de verdad, por lo tanto podemos devolverlo directamente.
In [9]:
def es_primo(n):
'''
Devuelve True si el número n es primo.
'''
# Versión con acumulador
_es_primo = True
for m in range(2,n):
_es_primo = _es_primo and (n%m != 0)
return _es_primo
def es_primo2(n):
'''
Devuelve True si el número n es primo.
'''
# Versión sin acumulador
for m in range(2,n):
if n % m == 0:
return False
return True
print('¿Es primo 27?:', es_primo(27))
print('¿Es primo 31?:', es_primo(31))
Notas de la clase:
n % m
es 0, estamos en condiciones de afirmar que el número no es primo y por lo tanto podemos devolver False directamente. Pero si n % m
es distinto de 0, entonces todavia no sabemos nada y tenemos que seguir iterando.
In [10]:
Image(filename='./clase-23-03-2018_image/and_univalue.jpg')
Out[10]:
Un error muy común es intentar devolver la condición adentro de ciclos. En general, adentro de un ciclo no debería devolverse una condición directamente.
Les recomendamos que para que quede todo claro, prueben al menos los ejercicios 3.3 y 4.1.b en Python Tutor, ademas les va a servir para repasar la parte de seguimientos. Les dejamos de ejemplo una ejecucion para la version con acumulador del 4.1.b, y que vean que efectivamente se cumple lo que se muestra en el diagrama.